﻿Imports System.Data.OleDb
'ce qui marche:
'   Recherche de véhicule
'   Ajout de véhicule
'   Modification de véhicule
'   Suppression de véhicule

'problèmes actuels:
'   l'option de recherche par option ne fonctionne pas
'   l'option de recherche par date de location n'est pas encore codé

Public Class frmGestionVehicules

    Dim bdVehicules As cls_GestionBD
    Dim vehicules As New ArrayList

    Private Sub frmGestionVehicules_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'ferme l'option de recherche détaillé
        btnRechercheDetaillee.PerformClick()

        'si on est en mode recherche, bloque les bouton d'ajout, modification, suppression et affiche le bouton sélectionner
        If recherche = True Then
            btnAjouter.Enabled = False
            btnModifier.Enabled = False
            btnSupprimer.Enabled = False
            btnSelectionner.Visible = True
        Else
            btnAjouter.Enabled = True
            btnModifier.Enabled = True
            btnSupprimer.Enabled = True
            btnSelectionner.Visible = False
        End If

        'remplis les comboBox
        remplirComboBox(cboType, "nomCategorie", "tblCategories")
        remplirComboBox(cboMarque, "marque", "tblVehicules")
        remplirComboBox(cboModele, "modele", "tblVehicules")
        cboTransmission.Text = cboTransmission.Items(0)

        'replis la liste des options
        remplirOptions()

        'actualise le listView
        remplirListView()

    End Sub

    Sub remplirComboBox(ByRef CB As ComboBox, ByVal element As String, ByVal table As String)

        Dim bdComboBox As New cls_GestionBD("taco.mdb")
        bdComboBox.remplirDataSet("SELECT DISTINCT " & element & " FROM " & table, "tblComboBox")

        'vide le comboBox
        CB.Items.Clear()
        CB.Items.Add("Tous")
        CB.Text = CB.Items(0)

        'créé un élément dans le comboBox pour chaque enregistrement retourné par la requête SQL
        For Each ligne As DataRow In bdComboBox.dsBd.Tables("tblComboBox").Rows
            CB.Items.Add(ligne.Item(0))
        Next

    End Sub

    Sub remplirOptions()

        'Dim bdOptions As New cls_GestionBD("taco.mdb")
        'bdOptions.remplirDataSet("SELECT DISTINCT nomOption FROM tblOptions", "tblOptions")

        'vide le comboBox
        lstOptions.Items.Clear()

        'créé un élément dans le comboBox pour chaque enregistrement retourné par la requête SQL
        'For Each ligne As DataRow In bdOptions.dsBd.Tables("tblOptions").Rows
        '    lstOptions.Items.Add(ligne.Item(0))
        'Next

        For Each opt As clsOptions In options
            lstOptions.Items.Add(opt.nom)
        Next

    End Sub

    Sub remplirListView()

        Me.Enabled = False

        bdVehicules = New cls_GestionBD("taco.mdb")

        bdVehicules.daBd.SelectCommand = New OleDbCommand( _
            "SELECT * " & _
            "FROM tblVehicules " & _
            "WHERE TRUE ")

        'bdVehicules.daBd.SelectCommand = New OleDbCommand( _
        '    "SELECT v.noVehicule as [Numéro du véhicule], v.noImmatriculation AS [Numéro d'immatriculation], c.nomCategorie AS Catégorie, v.marque AS Marque, v.modele As Modèle, v.actif " & _
        '    "FROM tblVehicules v, tblCategories c " & _
        '    "WHERE v.noCategorie = c.noCategorie ")

        'pour chaque option de recherche disponnible, vérifie si l'utilisateur a entré quelque chose et,
        'le cas échéant, ajoute une condition dans la requête SQL
        If cboType.Text <> "Tous" Then
            For Each categorie As clsCategorie In categories
                If categorie.nomCategorie = cboType.Text Then
                    bdVehicules.daBd.SelectCommand.CommandText &= "AND noCategorie = @noCategorie "
                    bdVehicules.daBd.SelectCommand.Parameters.Add("@noCategorie", OleDbType.VarChar, 25).Value = categorie.noCategorie
                End If
            Next
            'bdVehicules.daBd.SelectCommand.CommandText &= "AND c.nomCategorie = @nomCategorie "
            'bdVehicules.daBd.SelectCommand.Parameters.Add("@nomCategorie", OleDbType.VarChar, 25).Value = cboType.Text
        End If
        If cboMarque.Text <> "Tous" Then
            bdVehicules.daBd.SelectCommand.CommandText &= "AND marque = @marque "
            bdVehicules.daBd.SelectCommand.Parameters.Add("@marque", OleDbType.VarChar, 25).Value = cboMarque.Text
        End If
        If cboModele.Text <> "Tous" Then
            bdVehicules.daBd.SelectCommand.CommandText &= "AND modele = @modele "
            bdVehicules.daBd.SelectCommand.Parameters.Add("@modele", OleDbType.VarChar, 25).Value = cboModele.Text
        End If
        If txtNumeroImmatriculation.Text <> "" Then
            bdVehicules.daBd.SelectCommand.CommandText &= "AND noImmatriculation = @noImmatriculation "
            bdVehicules.daBd.SelectCommand.Parameters.Add("@noImmatriculation", OleDbType.VarChar, 25).Value = txtNumeroImmatriculation.Text
        End If
        If optActif.Checked Then
            bdVehicules.daBd.SelectCommand.CommandText &= "AND actif = true "
        End If
        If updNombrePlaces.Value <> 0 Then
            bdVehicules.daBd.SelectCommand.CommandText &= "AND nbrPlaces = @nbrPlaces "
            bdVehicules.daBd.SelectCommand.Parameters.Add("@nbrPlaces", OleDbType.VarChar, 25).Value = updNombrePlaces.Value
        End If
        If updCapaciteChargement.Value <> 0 Then
            bdVehicules.daBd.SelectCommand.CommandText &= "AND capaciteChargement = @capaciteChargement "
            bdVehicules.daBd.SelectCommand.Parameters.Add("@capaciteChargement", OleDbType.VarChar, 25).Value = updCapaciteChargement.Value
        End If
        If cboTransmission.Text <> "Tous" Then
            bdVehicules.daBd.SelectCommand.CommandText &= "AND transmission = @transmission "
            bdVehicules.daBd.SelectCommand.Parameters.Add("@transmission", OleDbType.VarChar, 25).Value = cboTransmission.Text
        End If
        If dtpLibreDu.Checked And dtpLibreAu.Checked = False Then

            Dim dateDebut As Date = FormatDateTime(dtpLibreDu.Value, DateFormat.ShortDate)

            bdVehicules.daBd.SelectCommand.CommandText &= _
                "AND noVehicule NOT IN(" & _
                "SELECT noVehicule " & _
                "FROM tblLocations " & _
                "WHERE dateDebut >= #" & dateDebut & "# OR dateFinLocation >= #" & dateDebut & "#)"
        ElseIf dtpLibreDu.Checked = False And dtpLibreAu.Checked Then

            Dim dateFin As Date = FormatDateTime(dtpLibreAu.Value, DateFormat.ShortDate)

            bdVehicules.daBd.SelectCommand.CommandText &= _
                "AND noVehicule NOT IN(" & _
                "SELECT noVehicule " & _
                "FROM tblLocations " & _
                "WHERE dateDebut <= #" & dateFin & "#) "
        ElseIf dtpLibreDu.Checked And dtpLibreAu.Checked Then

            Dim dateDebut As Date = FormatDateTime(dtpLibreDu.Value, DateFormat.ShortDate)
            Dim dateFin As Date = FormatDateTime(dtpLibreAu.Value, DateFormat.ShortDate)

            bdVehicules.daBd.SelectCommand.CommandText &= _
                "AND noVehicule NOT IN(" & _
                "SELECT noVehicule " & _
                "FROM tblLocations " & _
                "WHERE dateDebut >= #" & dateDebut & "# " & _
                "AND dateDebut <= #" & dateFin & "# " & _
                "OR dateFinLocation >= #" & dateDebut & "# " & _
                "AND dateFinLocation <= #" & dateFin & "#) "

        End If
        If lstOptions.CheckedItems.Count <> 0 Then
            bdVehicules.daBd.SelectCommand.CommandText &= "AND noVehicule IN(" & _
                "SELECT noVehicule FROM tblOptionsVehicules WHERE noOption IN(" & _
                "SELECT noOption FROM tblOptions WHERE nomOption in("
            For ctr As Integer = 0 To lstOptions.CheckedItems.Count - 2
                bdVehicules.daBd.SelectCommand.CommandText &= "@param" & ctr & ", "
                bdVehicules.daBd.SelectCommand.Parameters.Add("@param" & ctr, OleDbType.VarChar, 25).Value = lstOptions.CheckedItems(ctr)
            Next

            bdVehicules.daBd.SelectCommand.CommandText &= "@param" & lstOptions.CheckedItems.Count - 1 & "))) "
            bdVehicules.daBd.SelectCommand.Parameters.Add("@param" & lstOptions.CheckedItems.Count - 1, OleDbType.VarChar, 50).Value = lstOptions.CheckedItems(lstOptions.CheckedItems.Count - 1)
        End If

        bdVehicules.daBd.SelectCommand.CommandText &= "ORDER BY noCategorie, marque, modele, annee"

        'remplit le dataSet avec la requête SQL du dataAdapter
        bdVehicules.remplirDataSet("tblVehicules")

        'vide la listView
        lstResultats.Items.Clear()
        vehicules.Clear()

        For Each row As DataRow In bdVehicules.dsBd.Tables("tblVehicules").Rows
            vehicules.Add(New clsVehicule(row))
        Next

        For Each vehicule As clsVehicule In vehicules

            Dim LI As New ListViewItem(vehicule.noVehicule)

            LI.SubItems.Add(vehicule.categorie.nomCategorie)
            LI.SubItems.Add(vehicule.marque)
            LI.SubItems.Add(vehicule.modele)
            LI.SubItems.Add(vehicule.annee)
            LI.SubItems.Add(vehicule.noImmatriculation)

            lstResultats.Items.Add(LI)

        Next

        ''créé une colonne dans la listView pour chaque élément de la requête SQL
        'For ctr As Integer = 0 To bdVehicules.dsBd.Tables("tblVehicules").Columns.Count - 1
        '    lstResultats.Columns.Add(bdVehicules.dsBd.Tables("tblVehicules").Columns(ctr).ColumnName, 130)
        '    If lstResultats.Columns(ctr).Text = "Numéro du véhicule" Then
        '        lstResultats.Columns(ctr).Width = 0
        '    End If
        'Next

        ''créé un élément dans le listView pour chaque enregistrement retourné par la requête SQL
        'For Each vehicule As DataRow In bdVehicules.dsBd.Tables("tblVehicules").Rows

        '    'on créé un nouvel item
        '    Dim LI As New ListViewItem
        '    LI.Text = vehicule.Item(0)

        '    'on lui ajouter toutes les informations de l'enregistrement
        '    For ctr As Integer = 1 To bdVehicules.dsBd.Tables("tblVehicules").Columns.Count - 1
        '        LI.SubItems.Add(vehicule.Item(ctr))
        '    Next

        '    lstResultats.Items.Add(LI)

        'Next

        Me.Enabled = True

    End Sub

    Private Sub btnRechercheDetaillee_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRechercheDetaillee.Click
        'affiche ou fait disparaitre le menu de recherche détaillée
        If conRechercheDetaille.Visible = True Then
            conRechercheDetaille.Visible = False
            lstResultats.Height += conRechercheDetaille.Height
            lstResultats.Top -= conRechercheDetaille.Height
            btnRechercheDetaillee.Text = "/\"
        Else
            conRechercheDetaille.Visible = True
            lstResultats.Height -= conRechercheDetaille.Height
            lstResultats.Top += conRechercheDetaille.Height
            btnRechercheDetaillee.Text = "\/"
        End If

    End Sub

    Private Sub btnQuitter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQuitter.Click
        Me.Close()
    End Sub

    Private Sub btnChercher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChercher.Click
        'actualise le listView
        remplirListView()
    End Sub

    Private Sub btnModifier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModifier.Click
        'noVehiculeModifier = lstResultats.SelectedItems(0).SubItems(0).Text
        'frmDetailsVehicule.ShowDialog()

        For Each vehicule As clsVehicule In vehicules
            If vehicule.noVehicule = lstResultats.SelectedItems(0).Text Then
                frmDetailsVehicule.ShowDialog(vehicule)
                Exit For
            End If
        Next
    End Sub

    Private Sub btnAjouter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAjouter.Click
        'noVehiculeModifier = Nothing
        'frmDetailsVehicule.ShowDialog()

        frmDetailsVehicule.ShowDialog(New clsVehicule())
    End Sub

    Private Sub btnSupprimer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSupprimer.Click
        For Each vehicule As clsVehicule In vehicules
            If vehicule.noVehicule = lstResultats.SelectedItems(0).Text Then
                vehicule.actif = False
                vehicule.enregistrer()
                Exit For
            End If
        Next
        'Dim bdDesactiverVehicule As New cls_GestionBD("taco.mdb")
        'bdDesactiverVehicule.daBd.SelectCommand = New OleDbCommand("SELECT * FROM tblVehicules WHERE noVehicule = @noVehicule")
        'bdDesactiverVehicule.daBd.SelectCommand.Parameters.Add("@noVehicule", OleDbType.VarChar, 50).Value = lstResultats.SelectedItems(0).Text

        'bdDesactiverVehicule.remplirDataSet("tblVehicule")

        ''on désactive l'enregistrement
        'bdDesactiverVehicule.dsBd.Tables("tblVehicule").Rows(0).Item("actif") = False

        ''on met à jour la base de données et on rafraichit le listView
        'bdDesactiverVehicule.miseAJourBD("tblVehicule")
        remplirListView()
    End Sub

    Private Sub btnSelectionner_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelectionner.Click
        If lstResultats.SelectedItems.Count <> 1 Then
            MsgBox("Vous devez sélectionner un et un seul véhicule.")
        Else

            For Each vehicule As clsVehicule In vehicules
                If vehicule.noVehicule = lstResultats.SelectedItems(0).Text Then
                    frmDetailsLocation.locatio.vehicule = vehicule
                    frmDetailsLocation.afficherVehicule(vehicule)
                    Exit For
                End If
            Next

            recherche = False
            Me.Close()
        End If
    End Sub

    Private Sub frmGestionVehicules_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        Me.Dispose()
    End Sub

    Private Sub lstResultats_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstResultats.DoubleClick
        If recherche Then
            btnSelectionner.PerformClick()
        Else
            btnModifier.PerformClick()
        End If
    End Sub
End Class